iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0

在這次鐵人賽的最後,我想要來講加密傳輸資料

Obtain certificate

我們用之前提到的 Let’s Encript 來獲得憑證

nginx/sites-available 再增加一個網站設定,然後再做個連結到 nginx/sites-enabled,設定的內容就隨便寫個 server_namelisten 就好了

server{
    listen 80;
    server_name  database.mydomain.com;
}

然後 sudo certbot run,按照之前的步驟來獲得憑證

mongo.pem

要讓安全憑證給 MongoDB 使用,我們要先把公私鑰合併成一個 .pem

sudo cat /etc/letsencrypt/archive/’+[db_domain]+’/{fullchain1.pem,privkey1.pem} | sudo tee /etc/letsencrypt/live/’+[db_domain]+’/mongo.pem

mongod.cfg

我們可以選擇使用 TLS 或 SSL 加密,TLS 是比較新,更安全的加密技術,所以我是選擇用 TLS

mongod.cfg 加入以下內容

net:
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/letsencrypt/live/[db_domain]/mongo.pem
  port: 27017
  bindIp: 127.0.0.1, your-domain

Auto renew mongo.pem and restart MongoDB

Let’s Encript 的 certbot 工具有提供自動更新憑證的方法,但是我們需要更新憑證後重新合成一個 mongo.pem,然後重啟 MongoDB,所以我寫了一個 python script 在做這件事

import os, time, datetime

# global settings ###################################
password=[your password]
renew_days=10
# mongo pem #########################################
db_domain=[your db domain]
db_server_path=[your db path]


while True:
    print('\n'*5)
    print(str(datetime.datetime.now())[0:19])
    os.popen("sudo -S %s"%('certbot renew'), 'w').write(password)
    time.sleep(5)
    print('nginx reload')
    os.popen("sudo -S %s"%('nginx -s reload -v'), 'w').write(password)

    # mongo pem ######################
    print('\n'*5)
    print('killall mongod')
    os.system('killall mongod')
    time.sleep(5)

    print('\n'*2)
    print('generate mongo.pem')
    os.popen("sudo -S %s"%('cat /etc/letsencrypt/archive/'+db_domain+'/{fullchain1.pem,privkey1.pem} | ')
        +"sudo -S %s"%('tee /etc/letsencrypt/live/'+db_domain+'/mongo.pem'), 'w').write(password)
    time.sleep(5)

    print('\n'*2)
    print('start mongodb')
    os.chdir(db_server_path)
    os.system('mongod --config mongod.cfg --fork')

    # every ${renew_days} ################
    print('\n'*5)
    print('try to renew the certificate every '+str(renew_days)+' days')
    time.sleep(86400*renew_days)

Client connect

現在後端想要連接 MongoDB,必須在 connect string 結尾加上 ?tls=true&tlsAllowInvalidCertificate=true

mongodump

如果想要透過 mongodump 匯出資料庫,要在 connect string 結尾加上 --ssl --tlsInsecure


上一篇
讓網站更安全,不准直接連我的網站 IP
系列文
Vue+Django+MongoDB+Nginx 全端開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言